package cli

import (
	"bufio"
	"context"
	"fmt"
	"os"
	"strings"

	"gitee.com/EagleMao/eino_n9e_tool/pkg/logger"
	"github.com/cloudwego/eino/flow/agent/react"
	"github.com/cloudwego/eino/schema"
	"go.uber.org/zap"
)

type Cli struct {
	agent *react.Agent
}

func NewCli(agent *react.Agent) *Cli {
	return &Cli{
		agent: agent,
	}
}

func (c *Cli) Run(ctx context.Context) error {
	fmt.Println("===========================================")
	fmt.Println("  Nightingale Monitoring AI Assistant")
	fmt.Println("===========================================")
	fmt.Println()
	fmt.Println("你可以用自然语言查询监控数据，例如：")
	fmt.Println("  - 查询最近的告警")
	fmt.Println("  - 查询P1级别的告警")
	fmt.Println("  - 查询当前实例监控指标")
	fmt.Println()
	fmt.Println("输入 'exit' 或 'quit' 退出")
	fmt.Println("输入 'clear' 清屏")
	fmt.Println("===========================================")
	fmt.Println()

	scanner := bufio.NewScanner(os.Stdin)

	for {
		select {
		case <-ctx.Done():
			fmt.Println("\n再见！")
			return ctx.Err()
		default:
			fmt.Print("你 > ")
			if !scanner.Scan() {
				if err := scanner.Err(); err != nil {
					return fmt.Errorf("scanner error: %w", err)
				}
				return nil
			}

			input := strings.TrimSpace(scanner.Text())

			if input == "" {
				continue
			}

			// 处理特殊命令
			switch strings.ToLower(input) {
			case "exit", "quit":
				fmt.Println("再见！")
				return nil
			case "clear":
				fmt.Print("\033[H\033[2J")
				continue
			case "help":
				c.printHelp()
				continue
			}

			// 处理查询
			c.processQuery(ctx, input)

		}
	}
}

func (c *Cli) printHelp() {
	fmt.Println()
	fmt.Println("=== 可用命令 ===")
	fmt.Println("exit, quit  - 退出程序")
	fmt.Println("clear       - 清屏")
	fmt.Println("help        - 显示此帮助信息")
	fmt.Println()
	fmt.Println("=== 查询示例 ===")
	fmt.Println("  - 查询当前存在的活跃告警")
	fmt.Println("  - 查询P1级别的告警")
	fmt.Println("  - 查询当前实例监控指标")
	fmt.Println("  - 查询近三小时内的历史告警")
	fmt.Println()
}

func (c *Cli) processQuery(ctx context.Context, input string) {
	persona := `# 
你是一个夜莺告警助手，根据用户的需要,简洁明了的回答问题。
`
	var outMessage *schema.Message
	outMessage, err := c.agent.Generate(ctx, []*schema.Message{
		{
			Role:    schema.System,
			Content: persona,
		},
		{
			Role:    schema.User,
			Content: input,
		},
	})

	if err != nil {
		logger.Error("react agent 生成对话失败", zap.Error(err))
		return
	}

	fmt.Println("AI >")
	fmt.Println(outMessage.Content)
	fmt.Println()

}
